腐烂的橘子
思想：bfs
首先第一步将所有烂的橘子放到队列中，然后以队列的头结点为基准，一一遍历头结点附近的节点得出结果
class Solution {
public:
    int nextP[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; 
    int orangesRotting(vector<vector<int>>& grid) {
        if(grid.empty())
            return 0;
        int row=grid.size();
        int col=grid[0].size();
        vector<vector<int>> book(row,vector<int>(col,0));
        queue<pair<int,int>> q;
        //遍历矩阵所有橘子 ，将坏橘子都放进去
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                if(grid[i][j]==2)
                {
                    q.push(make_pair(i,j));
                    book[i][j]=1;
                }
            }
        } 
        int step=0;//用来计数
        while(!q.empty())
        {
            int flag=0;
            int size=q.size();
            while(size--)
            {
                pair<int,int> cur=q.front();
                q.pop();
                for(int i=0;i<4;i++)
                {
                    int newx=cur.first+nextP[i][0];
                    int newy=cur.second+nextP[i][1];
                    if(newx>=row||newx<0||newy>=col||newy<0)
                        continue;
                    //有可能队列中有元素 但是没有需要感染的橘子了
                    if(grid[newx][newy]==1&&book[newx][newy]==0)
                    {
                        flag=1;
                        q.push(make_pair(newx,newy));
                        grid[newx][newy]=2;
                        book[newx][newy]=1;
                    }
                }
            }
            if(flag==1)
                step++;  //只有有感染的时候才会进行step++
        }
        //判断 矩阵中是否还有新鲜橘子存在
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                if(grid[i][j]==1)
                {
                    return -1;
                }
            }
        }
        return step;
    }
    
};